package com.apps.java.javanote02;

import java.util.*;

public class _24多线程_线程同步 {
    /**
     * 线程
     * 	一、多线程数据安全问题：
     * 		1.为什么出现问题？（判断多线程程序是否会有数据安全问题的标准）
     *			（1）是否是多线程环境
     *			（2）是否有共享环境
     *			（3）是否有多条语句操作共享数据
     *		2.如何解决多线程安全问题呢？
     *			基本思想：让程序没有安全问题的环境
     *		3.如何实现？
     *			（1）将多条语句操作共享数据的代码锁起来，让任意时刻只能有一个线程执行即可
     * 			（2）java提供了同步代码块的方式来解决
     *
     * 	二、同步代码块
     * 		锁多条语句操作共享数据，可以使用同步代码块来实现
     * 		1.格式
     * 			synchronized(任意对象){
     * 				多条语句操作共享数据的代码;
     * 			}
     * 		2.synchronized(任意对象)：相当于给代码加锁了，任意对象就可以看做是一把锁
     *
     * 		3.同步的好处和弊端
     * 			（1）好处：解决了多线程的数据安全问题
     * 			（2）弊端：当线程很多时，由于每个线程都会判断同步上的锁，非常消耗资源，无形中会降低程序的运行效率
     *
     * 	三、同步方法
     * 		就是将synchronized关键字加到方法上
     * 		1.同步方法
     * 			（1）格式：
     * 				修饰符 synchronized 返回值类型 方法名(方法参数){}
     * 			（2）同步方法的锁对象是什么呢？
     * 				this
     * 		2.同步静态方法：就是将synchronized关键字加到静态方法上
     * 			（1）格式：
     * 				修饰符 static synchronized 返回值类型 方法名(方法参数){}
     * 			（2）同步静态方法的锁对象是什么呢？
     * 				类名.class
     *
     * 	三、线程安全的类
     * 		1.StringBuffer
     * 			（1）线程安全，可变的字符序列
     * 			（2）从版本JDK5开始，被StringBuilder替代。通常应该使用StringBuilder类，
     * 			           因为它支持所有相同的操作，但它更快，因为不执行同步。
     * 		2.Vector
     * 			从java2平台v1.2开始，该类改进了List接口，使其称为Java Collections Framework的成员。
     * 			与新的集合实现不同，Vector被同步。如果不需要线程安全的实现，建议使用ArrayList代替Vector
     * 		2.Hashtable
     * 			（1）该类实现了一个哈希表，它将键映射到值。任何非null对象都可以作为键或值
     *			（2）从Java2平台v1.2开始，该类进行改进，实现了Map接口，使其称为Java Collections Framework的成员。
     *			           与新的集合实现不同，Hashtable被同步，如果不需要线程安全的实现，建议使用HashMap代替Hashtable
     *
     * 	四、Lock锁
     * 		1.概述：	为了清晰的表达如何加锁和释放锁，JDK以后提供了一个新的锁对象Lock
     * 				Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作
     *
     * 		2.Lock中提供了获得锁和释放锁的方法
     * 			（1）void lock()：获得锁
     * 			（2）void unlock()：释放锁
     *
     * 		3.采用Lock接口的实例类ReentrantLock来实例化
     * 			构造方法：
     * 				ReentrantLock()：创建一个ReentrantLock的实例
     *
     */
    public static void main(String[] args) {
        //线程安全，可变的字符序列，该接口内的方法基本都是可同步的
        StringBuffer sb = new StringBuffer();

        Vector<String> v = new Vector<>();
        v.add("a");
        v.add("t");
        v.add("s");

        Hashtable<String, String> ht = new Hashtable<>();

        //static<T> List<T> synchronizedList(List<T> list)返回由指定列表支持的同步（线程安全）列表
        List<Object> synlist  = Collections.synchronizedList(new ArrayList<>());

    }
}
